ZyLiu's Blog

Core File的生成和查看

字数统计: 630阅读时长: 2 min
2018/09/25 Share

coredump配置

开启coredump功能

输入命令ulimit,其输出代表生成的core文件大小的限制,如果输出为0,则说明coredump功能没有开启。

使用命令ulimit -c unlimited开启coredump功能,并且不限制core文件的大小。

如果要限制core文件的大小,则将unlimited替换为要限制的core文件的大小,单位为block(KB)。

Core文件的保存路径

core文件的生成位置由/proc/sys/kernel/core_pattern中的配置决定。默认情况下,其内容为cor,程序出错时将在工作目录生成名为core的core文件。(此处不确定)
可以将配置文件内容改为/home/ubuntu/sdcard/CoreDump/core-%e-%p-%t,则core文件生成在目录/home/ubuntu/sdcard/CoreDump,文件名的格式为core-命令名-pid-时间戳。

修改配置文件时不能直接用编辑器编辑/proc/sys/kernel/core_pattern。需要先用su命令切换为root用户,然后使用命令编辑文件:

1
echo /home/coredump/corename > /proc/sys/kernel/core_pattern

上述命令将core文件生成在/home/coredump/目录下。

core文件的命名规则:
%p - pid
%u - uid
%g - 当前gid
%s - 导致产生core的信号
%t - core文件生成的unix时间
%h - 主机名
%e - 命令名
若要将core文件生成位置恢复为默认,使用以下命令:

1
echo core > /proc/sys/kernel/core_pattern

core文件的读取

有了core文件之后,可以使用GDB来进行调试。

调试方式为使用命令:

1
gdb program core

其中program为生成core文件的对应程序名,core为core文件名。
例如,现有test.c内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int func(int *p)
{
int y = *p;
return y;
}
int main()
{
int *p = NULL;
return func(p);
}
```

使用gcc编译生成可执行文件test:
```sh
gcc –o test test.c –g

运行test,生成core文件,以默认设置为例,则core生成在当前目录。
使用命令gdb test core,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
Core was generated by './test'.
Program terminated with signal 11, Segmentation fault.
#0 0x080483cd in func (p=0x0) at test.c:5
5 int y = *p;

(gdb) where
#0 0x080483cd in func (p=0x0) at core_demo.c:5
#1 0x080483ef in main () at core_demo.c:12
(gdb) info frame
Stack level 0, frame at 0xffd590a4:
eip = 0x80483cd in func (test.c:5); saved eip 0x80483ef
called by frame at 0xffd590c0
source language c.
Arglist at 0xffd5909c, args: p=0x0
Locals at 0xffd5909c, Previous frame's sp is 0xffd590a4
Saved registers:
ebp at 0xffd5909c, eip at 0xffd590a0
(gdb)

可以看到程序错误的原因在最后两行显示。可以使用where命令再次显示程序崩溃原因。

参考资料:
http://www.cnblogs.com/hazir/p/linxu_core_dump.html

CATALOG
  1. 1. coredump配置
    1. 1.1. 开启coredump功能
    2. 1.2. Core文件的保存路径
  2. 2. core文件的读取